在swoole程序中禁止使用exit/die,如果PHP代码中有exit/die
,当前工作的Worker进程、Task进程、User进程、以及swoole_process
进程会立即退出。
使用exit/die后Worker进程会因为异常退出, 被master进程再次拉起, 最终造成进程不断退出又不断启动和产生大量警报日志.
建议使用try/catch
的方式替换exit/die
,实现中断执行跳出PHP
函数调用栈。
function swoole_exit($msg)
{
//php-fpm的环境
if (ENV=='php')
{
exit($msg);
}
//swoole的环境
else
{
throw new Swoole\ExitException($msg);
}
}
以上代码并未实现
ENV
常量和Swoole\ExitException
,请自行实现
异常处理的方式比exit/die
更友好,因为异常是可控的,exit/die
不可控。在最外层进行try/catch即可捕获异常,仅终止当前的任务。Worker进程可以继续处理新的请求,而exit/die
会导致进程直接退出,当前进程保存的所有变量和资源都会被销毁。如果进程内还有其他任务要处理,遇到exit/die
也将全部丢弃。